package com.ilearn.proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class CglibMeipo implements MethodInterceptor {

    public Object getInstance(Class<?> clazz) throws Exception {

        Enhancer enhancer = new Enhancer();

        // 代理类，说白了是要给某个类作为子类，从而继承其功能。
        // 这里就是设置，要把代理类设置为哪个类的子类，指定代理类的Super父类，那么代理类就具备了那个类的全部功能
        enhancer.setSuperclass(clazz);

        /*Field[] declaredFields = clazz.getDeclaredFields();

        for (Field declaredField : declaredFields) {
            declaredField.setAccessible(true);

            char[] value = (char[]) declaredField.get(clazz);

            value[0]='z';

        }*/


        // 这里是设置代理类由哪个类来进行调用。
        enhancer.setCallback(this);

        // 创建代理类
        return enhancer.create();

    }


    /**
     * 这里去写业务功能的增强部分
     *
     * @param o
     * @param method
     * @param objects
     * @param methodProxy
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println("我是媒婆，我要给你找对象，现在已经拿到你的需求");
        System.out.println("开始物色");

        methodProxy.invokeSuper(o, objects);

        System.out.println("如果合适的话，就办事");
        return o;
    }
}
